home *** CD-ROM | disk | FTP | other *** search
Text File | 1997-06-27 | 10.7 KB | 456 lines | [TEXT/CWIE] |
- // OTadsp.cp
- //#include "Ext4D.h"
- #include "OTdsp.h"
-
- typedef enum {
- kLoMem = -108,
- kNotSupported = -15000
- } PackageErrs;
-
- OSStatus DoNegotiateEOMOption(EndpointRef ep, Boolean enableEOM);
- OSStatus DoBind(OTNetConDataHandle netData, int qlen, StringPtr name);
- OSStatus DoConnect(OTNetConDataHandle netData);
- OSStatus doListen(TEndpoint* ep);
- OSErr RegName(OTNetConDataHandle netData, StringPtr name);
- void unRegName(OTNetConDataHandle netData);
- void strcpyPtoC ( char *dst, char *src);
- void strcatPtoC ( char *dst, char *src);
- short mystrlen ( char *str);
- long swapWords (long in);
-
- short mystrlen (char *str)
- {
- short i = 0;
- for ( i = 0; str[i]!='\0'; i++)
- { ;
- }
- // i--;
- return i;
- }
-
- void strcpyPtoC ( char *dst, char *src)
- {
- BlockMove(&src[1],dst, (long)(src[0]) );
- dst[src[0]] = 0;
- }
-
- void strcatPtoC ( char *dst, char *src)
- {
- short l;
- l = mystrlen(dst);
- BlockMove(&src[1],&dst[l], (long)(src[0]) );
- dst[l+src[0]] = 0;
- }
-
- OSErr RegName(OTNetConDataHandle netData, StringPtr name)
- {
- OSErr err = 0;
- OSStatus oserr = kOTNoError;
- TMapper* gOTMapper;
- char namebuf[72];
- DDPAddress* epAddr = &(*netData)->addr;
- TRegisterRequest regreq;
- TRegisterReply regreply;
-
- // set the network address for this name
- regreq.addr.len = sizeof(DDPAddress);
- regreq.addr.buf = (UInt8*)epAddr;
-
- // set up regreply
- regreply.addr.maxlen = 0;
- regreply.addr.buf = nil;
- // put name into address
- namebuf[0] = '\0';
- strcatPtoC( namebuf, (char*) name);
- if(mystrlen(namebuf)) //string is not empty
- {
- strcatPtoC(namebuf, (char*)"\p:NET_4DDB");
- gOTMapper = OTOpenMapper(OTCreateConfiguration(kNBPName), 0, &oserr);
- // create the NBP name string and set the len field for the string
- regreq.name.len = mystrlen(namebuf);
- regreq.name.maxlen = sizeof(namebuf);
- regreq.name.buf = (UInt8*)namebuf;
- err = gOTMapper->RegisterName( ®req, ®reply);
- err = gOTMapper->Close();
- (*netData)->nameID = regreply.nameid;
- }
- return err;
- }
-
- void unRegName(OTNetConDataHandle netData)
- {
- OSErr err = 0;
- OSStatus oserr = kOTNoError;
- TMapper* gOTMapper;
-
- gOTMapper = OTOpenMapper(OTCreateConfiguration(kNBPName), 0, &oserr);
- if ((oserr == 0) && ((*netData)->nameID>0))
- {
- gOTMapper->DeleteName((*netData)->nameID);
- (*netData)->nameID = 0;
- }
- if (oserr == 0) err = gOTMapper->Close();
- }
-
- OSStatus DoNegotiateEOMOption(EndpointRef ep, Boolean enableEOM)
-
- {
- UInt8 buf[kOTFourByteOptionSize]; // define buffer for fourByte Option size
- TOption* opt; // option ptr to make items easier to access
- TOptMgmt req;
- TOptMgmt ret;
- OSStatus err;
- Boolean isAsync = false;
-
- // return( 0L );
- opt = (TOption*)buf; // set option ptr to buffer
- req.opt.buf = buf;
- req.opt.len = sizeof(buf);
- req.flags = T_NEGOTIATE; // negotiate for EOM option
-
- ret.opt.buf = buf;
- ret.opt.maxlen = kOTFourByteOptionSize;
-
- opt->level = ATK_ADSP; // dealing with ADSP
- opt->name = OPT_ENABLEEOM;
- opt->len = kOTFourByteOptionSize;
- opt->status = 0;
- *(UInt32*)opt->value = enableEOM; // set the desired option level, true or false
-
- if (ep->IsSynchronous() == false) // check whether ep sync or not
- {
- isAsync = true; // set flag if async
- ep->SetSynchronous(); // set endpoint to sync
- //DebugStr("\pSetSynch;g");
- }
-
- err = ep->OptionManagement( &req, &ret);
-
- if (isAsync == true) // restore ep state if necessary
- {
- ep->SetAsynchronous();
- //DebugStr("\pSet Asynch;g");
- }
-
- // if no error then return the option status value
- if (err == kOTNoError)
- {
- if (opt->status != T_SUCCESS)
- err = opt->status;
- else
- err = kOTNoError;
- }
-
- return err;
- }
-
- OSStatus DoBind(OTNetConDataHandle netData, int qlen, StringPtr name)
- {
- char namebuf[72];
- OSStatus err;
- DDPNBPAddress myAddress; // To set up my address for the bind
- TEndpoint* ep = (*netData)->ep;
-
- myAddress.Init(0, 0, 0); // Source address & type
- //
- // Create the TBind for the request and return, holding my address
- //
- TBind reqBind, retBind;
- //
- // Set my name into the NBP address, and init the TBind with
- // the address (SetNBPEntity returns the size of the address).
- //
- reqBind.addr.buf = (UInt8*)&myAddress;
- namebuf[0] = '\0';
- strcatPtoC( namebuf, (char*) name);
- if(mystrlen(namebuf)) //string is not empty
- {
- strcatPtoC(namebuf, (char*)"\p:NET_4DDB");
- reqBind.addr.len = myAddress.SetNBPEntity(namebuf);
- } else {
- reqBind.addr.len = 0;
- }
- reqBind.qlen = qlen;
-
- HLockHi((Handle) netData );
- retBind.addr.buf = (UInt8*) &(*netData)->addr;
- retBind.addr.maxlen = sizeof(DDPAddress);
-
- // fprintf(stderr, "Issuing Bind(%d)\n", epNum);
- err = ep->Bind(&reqBind, &retBind);
- HUnlock( (Handle) netData );
- if ( err != kOTNoError )
- {
- // fprintf(stderr, "Bind(%d) fails with %d\n", epNum, err);
- //DebugStr("\pBind Fails.");
- }
- return err;
- }
-
- OSStatus DoConnect(OTNetConDataHandle netData)
- {
- TEndpoint* ep = (*netData)->ep;
- DDPAddress* dest = &(*netData)->addr;
-
- if ( dest == NULL ) // Need address
- {
- return kLoMem;
- }
- else
- {
- HLockHi( (Handle) netData );
- //
- // Allocate memory to hold a TCall structure and full ddp addresses
- //
- UInt8* p = new UInt8[sizeof(TCall) + kDDPAddressLength];
-
- TCall* reqCall = (TCall*)p;
-
- reqCall->addr.buf = (UInt8*)(p + sizeof(TCall));
- reqCall->addr.len = kDDPAddressLength;
- reqCall->opt.len = 0;
- reqCall->udata.len = 0;
- ((DDPAddress*)reqCall->addr.buf)->Init(*dest);
-
- OSStatus err = ep->Connect(reqCall, NULL);
-
- delete p;
- HUnlock( (Handle) netData );
- if (( err != kOTNoDataErr ) && ( err != kOTNoError ))
- {
- return err;
- }
- else
- {
- return kOTNoError;
- }
- }
- }
-
-
- long OTdspOpen(StringPtr Name, StringPtr Zone)
- {
- OSStatus err;
- long stop = 0;
- TEndpoint* ep;
- DDPAddress addr, addr2;
- NBPAddress nbpAddr;
- char namebuf[100];
- Str255 empty = "";
- OTNetConDataHandle netData = (OTNetConDataHandle) NewHandleClear(sizeof( OTNetConData ));
-
- if( netData == nil )
- return (kLoMem);
- namebuf[0] = '\0';
- strcatPtoC(namebuf,(char*)Name);
- strcatPtoC(namebuf,(char*)"\p:Net_4DDB@");
- strcatPtoC(namebuf,(char*)Zone);
- addr.Init(0, 0, 0);
- addr2.Init(0, 0, 0);
- InitOpenTransport();
- ep = OTOpenEndpoint(OTCreateConfiguration(kADSPName), 0, NULL, &err);
- if ( ep == NULL || err != kOTNoError ) stop = 1;
- (*netData)->ep = ep;
- //if ( stop == 0 ) err = DoNegotiateEOMOption(ep, true);
- if ( stop == 0 )
- {
- err = DoBind(netData,0,empty);
- if (err != kOTNoError) stop = 2;
- }
- TBind req, ret;
- if (stop == 0 )
- {
- req.addr.len = nbpAddr.Init(namebuf);
- req.addr.buf = (UInt8*) &nbpAddr;
- ret.addr.buf = (UInt8*) &addr2;
- ret.addr.maxlen = sizeof(DDPAddress);
- err = ep->ResolveAddress(&req, &ret,1000L);
- }
- (*netData)->addr = addr2;
- if ( stop == 0 ) err = DoConnect(netData);
- if (err != kOTNoError) stop = 3;
- if (stop != 0) return err;
- else return (long) netData;
- }
-
-
- long OTdspListen(StringPtr Name)
- {
- OSStatus err;
- long stop = 0;
- TEndpoint* ep;
- DDPAddress addr;
- Str255 empty = "";
- OTNetConDataHandle netData = (OTNetConDataHandle) NewHandleClear(sizeof( OTNetConData ));
-
- if( netData == nil )
- return (kLoMem);
-
- InitOpenTransport();
- addr.Init(0, 0, 0);
- ep = OTOpenEndpoint(OTCreateConfiguration(kADSPName), 0, NULL, &err);
- if ( ep == NULL || err != kOTNoError ) stop = 1;
- (*netData)->ep = ep;
- (*netData)->addr = addr;
- if (stop == 0)
- {
- err = DoBind(netData,1,empty);
- if (err != kOTNoError) stop = 2;
- }
- if (stop == 0)
- {
- err = RegName(netData,Name);
- if (err != kOTNoError) stop = 3;
- }
- // if (stop == 0) err = DoNegotiateEOMOption(ep, true);
- switch (stop) { //intentionally falls thru - cleanup errors
- case 4:
- ;
- case 3:
- unRegName(netData);
- case 2:
- err = ep->Unbind();
- case 1:
- err = ep->Close();
- }
- if (stop != 0) return err;
- else return (long) netData;
- }
-
-
- long OTClose(long id)
- {
- OTNetConDataHandle netData = (OTNetConDataHandle) id;
- TEndpoint* ep = (*netData)->ep;
- OSStatus err = ep->SndOrderlyDisconnect();
- err = ep->RcvOrderlyDisconnect();
- if ((*netData)->nameID > 0) unRegName(netData);
- err = ep->Unbind();
- err = ep->Close();
- CloseOpenTransport();
- return err;
- }
-
- OSStatus doListen(TEndpoint* ep)
- {
- DDPAddress myAddr;
- OSStatus err = kOTNoError;
- TCall lCall;
- lCall.addr.buf = (UInt8*)&myAddr;
- lCall.addr.maxlen = sizeof(myAddr);
- lCall.opt.maxlen = 0;
- lCall.udata.maxlen = 0;
- myAddr.Init(0,0,0);
- err = ep->Listen(&lCall);
- if ( err == kOTNoDataErr || err == kOTStateChangeErr )
- return kOTNoError;
- if ( err < 0 )
- return err;
-
- lCall.opt.len = 0;
- lCall.udata.len = 0;
- lCall.addr.len = 0;
- err = ep->Accept(ep, &lCall);
- return err;
- }
-
- long OTdspStatus(long id)
- {
- OTNetConDataHandle netData = (OTNetConDataHandle) id;
- TEndpoint* ep = (*netData)->ep;
- OSStatus err = kOTNoError;
- size_t count;
- OTResult state;
-
- //DebugStr("\pEnter OTdspStatus;g");
- state = ep->Look();
- switch (state ) {
- case T_LISTEN:
- //DebugStr("\pT_Listen.;g");
- err = doListen(ep);
- unRegName(netData);
- break;
- case T_ORDREL:
- //DebugStr("\pT_Ordrel.;g");
- err = ep->RcvOrderlyDisconnect();
- break;
- }
- state = ep->GetEndpointState();
- switch ( state ) {
- case T_IDLE:
- //DebugStr("\pT_Idle.;g");
- err = 2L;
- break;
- case T_INCON:
- //DebugStr("\pT_Incon.;g");
- err = doListen(ep);
- err = 2L;
- break;
- case T_DATAXFER:
- //DebugStr("\pT_Dataxfer.;g");
- err = ep->CountDataBytes(&count);
- if ((err == kOTNoError) && (count > 0))
- {
- err = 10L;
- //DebugStr("\pHave Chars;g");
- }
- else err = 4L;
- break;
- case T_INREL:
- //DebugStr("\pT_inrel.;g");
- err = ep->SndOrderlyDisconnect();
- err = 6L;
- break;
- }
- return err;
- }
-
- long OTChars(long id)
- {
- OTNetConDataHandle netData = (OTNetConDataHandle) id;
- TEndpoint* ep = (*netData)->ep;
- size_t count;
- OSStatus err = ep->CountDataBytes(&count);
- if ((err == kOTNoError) && (count > 0)) return count;
- else return 0;
- }
-
- long OTSend(long id, Str31 myText)
- {
- OTNetConDataHandle netData = (OTNetConDataHandle) id;
- TEndpoint* ep = (*netData)->ep;
- short len = mystrlen((char *)myText);
- // HLockHi((Handle) myText.fData);
- OTResult result = ep->Snd(myText, len, 0);
- // HUnlock((Handle) myText.fData);
- //DebugStr("\pchars sent;g");
- if ( result == len) return 0L;
- else return result;
- }
-
-
- void OTRecvText( long id, Str31 myText)
- {
- OTNetConDataHandle netData = (OTNetConDataHandle) id;
- TEndpoint* ep = (*netData)->ep;
- short len = 0;
- short done = 0;
- OTResult result;
- OTFlags flags = 0;
-
- // myText.fData = (CharsHandle) NewHandleClear( sizeof( Chars ) );
- // HLockHi( (Handle) myText.fData );
- do {
- result = ep->Rcv((myText+len), 30, &flags);
- //DebugStr("\pChars received;g");
- if ( result == kOTNoDataErr ) done = 1;
- if ( result == kOTNoDataErr || result == kOTLookErr ||
- result == kOTOutStateErr )
- result = kOTNoError;
- if (result > 0) len += result;
- } while ((done == 0) && (len < sizeof(Chars)));
- // myText.fSize = len;
- // HUnlock( (Handle) myText.fData );
- // return (myText);
- }
-